package cn.edu.lcu.cs.designpattern.composite.transparency;

import lombok.Data;

import java.util.List;

/**
 * 透明的组合模式，无论叶子还是分支，操作表面上都是相同的、透明的。
 */
@Data
public abstract class Node {
    public static final String NODE_TYPE_LEAF = "leaf";
    public static final String NODE_TYPE_BRANCH = "branch";
    private String type;
    private String value;
    private Node parent;

    /**
     * 虽然叶子节点没有孩子，但是为了透明化，仍然在此处定义了获取孩子的方法，可能是不安全的。
     *
     * @return
     */
    public abstract List<Node> getChildren();

    public abstract void add(Node child);

    public abstract void remove(Node child);

    public abstract Node getChild(int index);

    public abstract void print();

    public void doSomething() {
        System.out.println("叶子与分枝结点共同拥有的操作");
    }

    public abstract void traversal(Node node);
}
